280. Promtail 規則順序
WHY
全面使用istio的時候,
要將網路入口的log統一丟去loki管理,
篩選時碰到GPT的幻覺,
最後丟了測試結果,才更正過來。
Gemini 倒是一開始就給正確的答案。
Note
本來只有打算抓istio-system的log紀錄,
但翻了一下,每個pod底下的istio-proxy那些log,
對於日後判斷感覺也頗重要,就通通一起留著吧。
所以這次的目標是,抓取 namespace (istio-system)的所有log
以及 namesapce(default)底下的istio-proxy的container log。
只保留 ns 為 istio-system的話,沒什麼爭議。
relabel_configs:
# Rule 1: 保留 namespace 是 istio-system
- source_labels: [__meta_kubernetes_namespace]
regex: istio-system
action: keep
也可以在上面使用這段。
scrape_configs:
- job_name: pod-logs
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- istio-system
但當有兩個keep時,
就產生混亂了。
以下是錯誤的,當兩個一起掛上去,不會有任何log匯出到loki
GPT一直說,兩個keep規則,只要一個符合就好,
彼此的關聯是 OR
。
但實際上,
所有規則是依序由上而下套用,目標只有在通過所有 keep規則後,最終才會保留。
要完成or的選項,最好就是寫在同一條。
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_container_name]
separator: ";"
regex: (istio-system;.+)|(default;istio-proxy)
action: keep
Gemini 則有提供另一個思路,
加上一個虛擬的label ,設定為true,之後再將非true的drop。
relabel_configs:
# Rule 1: 如果 namespace 是 istio-system,給目標打上一個暫時標記 __temp_keep
- source_labels: [__meta_kubernetes_namespace]
regex: istio-system
action: replace # 使用 replace action 來添加/修改 label
target_label: __temp_keep # 設置一個暫時的 label 名稱
replacement: "true" # 給這個 label 一個值
# Rule 2: 如果 namespace 是 default 且 container 是 istio-proxy,也給目標打上同一個暫時標記 __temp_keep
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_container_name]
regex: default;istio-proxy
action: replace
target_label: __temp_keep
replacement: "true"
# Rule 3: 最後,只保留帶有 __temp_keep 標記的目標,丟棄沒有此標記的
- source_labels: [__temp_keep]
regex: "true" # regex 匹配 __temp_keep 的值
action: keep # 只保留匹配的目標 (即帶有 __temp_keep=true 的)
# (Optional) 清理暫時 label,如果不需要它傳到 Loki
- source_labels: [__temp_keep]
action: labeldrop
regex: __temp_keep